#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <poll.h>
#include <fcntl.h>
#include <signal.h>


int fd;  //要监视的文件描述符
char buf1[32] = {0};   


//SIGIO信号的信号处理函数
static void func(int signum)
{
    read(fd,buf1,32);
    printf ("buf is %s\n",buf1);
}


int main(int argc, char *argv[])  
{
  
    int ret;
    int flags;
    printf("open before \n");
    fd = open("/dev/test", O_RDWR);  //打开/dev/test设备，阻塞式访问
    printf("open after \n");

    if (fd < 0)
    {
        perror("open error \n");
        return fd;
    }
   printf("zhunben signal \n");
   signal(SIGIO,func); //步骤一：使用signal函数注册SIGIO信号的信号处理函数
   //步骤二：设置能接收这个信号的进程
   //fcntl 函数用来操作文件描述符
   // F_SETOWN 设置当前接收的SIGIO的进程
      printf("zhunben 设置当前接收的SIGIO的进程 \n");
   fcntl(fd,F_SETOWN,getpid());
   flags=fcntl(fd,F_GETFD);  //获取文件描述符标志
   //步骤三 开启信号驱动IO，使用fcntl 函数的F_SETFL命令打开FASYNC标志
    printf("zhunben 开启信号驱动IO，使用fcntl \n");

   fcntl(fd,F_SETFL,flags|FASYNC);
    printf("zhunben while before \n");
   while(1);
    printf("zhunben while after \n");
   close(fd);
   return 0 ;
    
}
